<!DOCTYPE html>



  


<html class="theme-next muse use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/blog/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/blog/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/blog/css/main.css?v=5.1.4" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/blog/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/blog/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/blog/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/blog/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT" />










<meta name="description" content="考虑到目前SVN版本管理工具在模块化开发、代码审查及离线开发方面存在的不足，希望通过引入GIT版本管理工具，来解决这些不足，以促进项目的快速迭代、持续集成及代码质量改善。 与SVN相比，GIT存在如下比较显著的优势：  分布式   相比于SVN，GIT更倾向于分布式模式，也就是每个开发人员从服务器上clone代码后会在自己的机器上克隆一个自己的版本库，这样开发人员可以在本地创建分支，来解决临时的实">
<meta property="og:type" content="article">
<meta property="og:title" content="GIT服务器部署">
<meta property="og:url" content="http://smallmuou.gitee.io/blog/2014/09/20/2014-9-20-git服务器部署/index.html">
<meta property="og:site_name" content="smallmuou&#39;s blog">
<meta property="og:description" content="考虑到目前SVN版本管理工具在模块化开发、代码审查及离线开发方面存在的不足，希望通过引入GIT版本管理工具，来解决这些不足，以促进项目的快速迭代、持续集成及代码质量改善。 与SVN相比，GIT存在如下比较显著的优势：  分布式   相比于SVN，GIT更倾向于分布式模式，也就是每个开发人员从服务器上clone代码后会在自己的机器上克隆一个自己的版本库，这样开发人员可以在本地创建分支，来解决临时的实">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="http://127.0.0.1:8080/2014-10-23_20-54-18.png =800x500">
<meta property="og:image" content="http://127.0.0.1:8080/markdown/2014-10-13_15-34-40.png">
<meta property="og:updated_time" content="2020-04-16T01:15:21.871Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="GIT服务器部署">
<meta name="twitter:description" content="考虑到目前SVN版本管理工具在模块化开发、代码审查及离线开发方面存在的不足，希望通过引入GIT版本管理工具，来解决这些不足，以促进项目的快速迭代、持续集成及代码质量改善。 与SVN相比，GIT存在如下比较显著的优势：  分布式   相比于SVN，GIT更倾向于分布式模式，也就是每个开发人员从服务器上clone代码后会在自己的机器上克隆一个自己的版本库，这样开发人员可以在本地创建分支，来解决临时的实">
<meta name="twitter:image" content="http://127.0.0.1:8080/2014-10-23_20-54-18.png =800x500">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/blog/',
    scheme: 'Muse',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://smallmuou.gitee.io/blog/2014/09/20/2014-9-20-git服务器部署/"/>





  <title>GIT服务器部署 | smallmuou's blog</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/blog/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">smallmuou's blog</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"><a href="https://github.com/smallmuou">https://github.com/smallmuou</a></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/blog/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/blog/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/blog/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://smallmuou.gitee.io/blog/blog/2014/09/20/2014-9-20-git服务器部署/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="smallmuou">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.gif">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="smallmuou's blog">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">GIT服务器部署</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2014-09-20T00:00:00+08:00">
                2014-09-20
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/blog/categories/版本管理/" itemprop="url" rel="index">
                    <span itemprop="name">版本管理</span>
                  </a>
                </span>

                
                
              
            </span>
          

          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>考虑到目前SVN版本管理工具在模块化开发、代码审查及离线开发方面存在的不足，希望通过引入GIT版本管理工具，来解决这些不足，以促进项目的快速迭代、持续集成及代码质量改善。</p>
<p>与SVN相比，GIT存在如下比较显著的优势：</p>
<ul>
<li><p>分布式</p>
<p>  相比于SVN，GIT更倾向于分布式模式，也就是每个开发人员从服务器上clone代码后会在自己的机器上克隆一个自己的版本库，这样开发人员可以在本地创建分支，来解决临时的实务，而不耽误已有的工作，同时还可以在离线状态下查看历史版本信息。</p>
</li>
<li><p>强化Branch</p>
<p>  我们知道SVN是通过复制整个工程代码来实现分支的创建，这样不仅耗时，而且不易合并，而GIT则是通过快照机制，可以非常快速地进行分支的创建、切换等。Branch非常有利用模块化开发，可以通过从主干分支新建一个Branch来进行新特性开发，并通过Merge来合并到主分支。</p>
</li>
<li><p>审查</p>
<p>  不像SVN，任何人都可以随地随意地往主分支提交代码，SVN变得更像是一种代码备份工具，GIT增加了Merge Request来强调了代码审查的过程，通过审核机制可以保证代码的干净新鲜。</p>
<p>  若想全面了解GIT与SVN相比的优劣，可以参考此<a href="http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html" target="_blank" rel="noopener">页面</a>.</p>
</li>
</ul>
<p>###选择<br>既然需要引入GIT作为版本管理工具，那就必须架设GIT服务器，关于GIT服务器，有Github、Gitlab、Gitcafe、BitBucket等，考虑到公司代码的安全性及访问速度，需要在内网构建一个GIT私有服务器，通过了解，<a href="https://about.gitlab.com" target="_blank" rel="noopener">Gitlab</a>是构建GIT私有服务器的一个不错选择，首先是开源，公司可以自由使用，其次社区活跃，更新快，可以保证稳定性；下面我将对Gitlab的部署方法进行说明。</p>
<p>##Gitlab服务器部署</p>
<p>###Install<br>Gitlab的部署大体有两种方式:<a href="https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md" target="_blank" rel="noopener">官方installation文档</a>和<a href="https://bitnami.com/stack/gitlab" target="_blank" rel="noopener">Bitnami集成</a>，关于这两种方法，本人都尝试过，推荐Bitnami集成，原因是问题少、安装方便、可以界面化配置，下面我介绍下Bitnami安装过程的几个要点:</p>
<ul>
<li>根据你linux系统位数<a href="https://bitnami.com/stack/gitlab/installer" target="_blank" rel="noopener">到此</a>下载相应的安装包.</li>
<li>安装过程有GUI和命令行2种配置方式，可以根据个人习惯自由选择.</li>
<li>填写Gitlab管理者帐号相关信息，并请务必记住，以保证后面Web登录.</li>
<li>建议开启邮箱配置，这样方便邮件通知，具体邮箱名称和SMTP主机可根据你自己邮箱服务来设置.</li>
<li>安装过程中可能会遇到端口被占用的情况，此情况有两种解决方案，其一，将占用端口的进程kill(可以通过lsof -i:xx来查看端口占用情况)，其二，更换端口.</li>
<li>运行后可能会出现HTTP 500等服务器类型错误，可以通过查看/opt/gitlab-xx.xx.xx-x/apps/gitlab/htdocs/log中的LOG日志来找出具体的原因，然后对症下药.</li>
</ul>
<pre>
root@wenva-virtual-machine:/develop# ./bitnami-gitlab-7.3.2-0-linux-x64-installer.run 
----------------------------------------------------------------------------
Welcome to the Bitnami Gitlab Stack Setup Wizard.

----------------------------------------------------------------------------
Select the components you want to install; clear the components you do not want 
to install. Click Next when you are ready to continue.

GitLab : Y (Cannot be edited)

GitLab CI [Y/n] :

Is the selection above correct? [Y/n]: 

----------------------------------------------------------------------------
Installation folder

Please, choose a folder to install Bitnami Gitlab Stack

Select a folder [/opt/gitlab-7.3.2-0]: 

----------------------------------------------------------------------------
Create Admin account

Bitnami Gitlab Stack admin user creation

Email Address [user@example.com]: xuwenfa@star-net.cn

Login [user]: master

Password :
Please confirm your password :
----------------------------------------------------------------------------
Hostname that will be used to create internal URLs. If this value is incorrect, 
you may be unable to access your Gitlab installation from other computers. It is 
advisable to use a Domain instead of an IP address for compatibility with 
different browsers.

Domain [127.0.1.1]: 

Do you want to configure mail support? [y/N]: y

----------------------------------------------------------------------------
Configure SMTP Settings

This is required so your application can send notifications via email.

Default email provider:

[1] GMail
[2] Custom
Please choose an option [1] : 2

----------------------------------------------------------------------------
Configure SMTP Settings

This data is stored in the application configuration files and may be visible to 
others. For this reason, it is recommended that you do not use your personal 
account credentials.

Username []: xuwenfa@star-net.cn

Password :
Re-enter :
SMTP Host []: mail.star-net.cn

SMTP Port []: 25

Secure connection

[1] None
[2] SSL
[3] TLS
Please choose an option [3] : 1

----------------------------------------------------------------------------
Setup is now ready to begin installing Bitnami Gitlab Stack on your computer.

Do you want to continue? [Y/n]: 

----------------------------------------------------------------------------
Please wait while Setup installs Bitnami Gitlab Stack on your computer.

 Installing
 0% ______________ 50% ______________ 100%
 #########################################



----------------------------------------------------------------------------
Setup has finished installing Bitnami Gitlab Stack on your computer.

Info: To access the Bitnami Gitlab Stack, go to
http://127.0.1.1:80 from your browser.
Press [Enter] to continue:
</pre>

<p>###Config<br>安装并运行，在提交代码到远程服务器(即git push origin &lt;branch)的时候会出现如下错误:</p>
<pre>
xuwenfadeMacBook-Pro-2:example wenva$ git push origin master
/opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:878:in `initialize': Connection refused - connect(2) (Errno::ECONNREFUSED)
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:878:in `open'
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:878:in `block in connect'
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/timeout.rb:52:in `timeout'
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:877:in `connect'
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
    from /opt/gitlab-7.3.2-0/ruby/lib/ruby/2.0.0/net/http.rb:851:in `start'
    from /opt/gitlab-7.3.2-0/apps/gitlab/gitlab-shell/lib/gitlab_net.rb:97:in `post'
    from /opt/gitlab-7.3.2-0/apps/gitlab/gitlab-shell/lib/gitlab_net.rb:27:in `allowed?'
    from /opt/gitlab-7.3.2-0/apps/gitlab/gitlab-shell/lib/gitlab_shell.rb:64:in `validate_access'
    from /opt/gitlab-7.3.2-0/apps/gitlab/gitlab-shell/lib/gitlab_shell.rb:25:in `exec'
    from /opt/gitlab-7.3.2-0/apps/gitlab/gitlab-shell/bin/gitlab-shell:16:in `<main>'
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
</main></pre>

<ul>
<li><strong>解决方案</strong></li>
</ul>
<p>编辑/home/git/gitlab-shell/config.yml，即gitlab_url改为你的IP+端口（默认是<a href="http://localhost:8080）" target="_blank" rel="noopener">http://localhost:8080）</a></p>
<pre>
...
gitlab_url: "http://192.168.60.151:80/"
...
</pre>

<p><img src="http://127.0.0.1:8080/2014-10-23_20-54-18.png =800x500" alt="image"></p>
<p>##Gitlab使用</p>
<p>###更换IP</p>
<ul>
<li>设置/home/git/gitlab-shell/config.yml的gitlab_url<pre>
...
gitlab_url: "http://192.168.60.151:80/"
...
</pre></li>
<li>设置/opt/gitlab-7.3.2-0/apps/gitlab/htdocs/gitlab_url.yml<pre>
...
gitlab:
  ## Web server settings (note: host is the FQDN, do not include http://)
  host: 192.168.60.151
  port: 80 # Set to 443 if using HTTPS, see installation.md#using-https for additional HTTPS configuration details
  https: false # Set to true if using HTTPS, see installation.md#using-https for additional HTTPS configuration details
...
</pre>

</li>
</ul>
<p>###服务启动和停止<br>Gitlab服务可以通过/opt/gitlab-xx.xx.xx-x/ctlscript.sh来控制，可以通过help来查看帮助说明</p>
<pre>
root@wenva-desktop:/opt/gitlab-7.3.2-0# ./ctlscript.sh help
usage: ./ctlscript.sh help
       ./ctlscript.sh (start|stop|restart|status)
       ./ctlscript.sh (start|stop|restart|status) mysql
       ./ctlscript.sh (start|stop|restart|status) apache
       ./ctlscript.sh (start|stop|restart|status) redis
       ./ctlscript.sh (start|stop|restart|status) gitlab_sidekiq
       ./ctlscript.sh (start|stop|restart|status) gitlabci_sidekiq
       ./ctlscript.sh (start|stop|restart|status) gitlabci_runner

help       - this screen
start      - start the service(s)
stop       - stop  the service(s)
restart    - restart or start the service(s)
status     - show the status of the service(s)
</pre>

<p>###备份和恢复<br>考虑到服务器迁移、代码安全等需求，需要对代码进行实时的备份，Gitlab提供的备份命令backup，下面将具体阐述如何进行备份:</p>
<ul>
<li>设置 </li>
</ul>
<p>可以通过编辑vim /opt/gitlab-7.3.2-0/apps/gitlab/htdocs/config/gitlab.yml文件来设定备份路径，找出”Backup settings”</p>
<pre>
## Backup settings
  backup:
    path: "tmp/backups"   # Relative paths are relative to Rails.root (default: tmp/backups/)
    # keep_time: 604800   # default: 0 (forever) (in seconds)

</pre>

<ul>
<li><p>备份(Backup)</p>
<p>  通过Gitlab自带的备份命令”bundle exec bin/rake gitlab:backup:create RAILS_ENV=production”,可以很容易地实现备份.</p>
</li>
</ul>
<pre>
root@wenva-desktop:/opt/gitlab-7.3.2-0# pwd
/opt/gitlab-7.3.2-0
root@wenva-desktop:/opt/gitlab-7.3.2-0# ./use_gitlab 
sh-4.1# cd apps/gitlab/htdocs/
sh-4.1# bundle exec bin/rake gitlab:backup:create RAILS_ENV=production
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
 Warning 
  You are running as user root, we hope you know what you are doing.
  Things may work/fail for the wrong reasons.
  For correct results you should run this as user git.

Dumping database ... 
Dumping MySQL database bitnami_gitlab ... [DONE]
done
Dumping repositories ...
 * master/ecommunity ... [SKIPPED]
 * wenva/mytest ... [SKIPPED]
 * wenva/xtool ... [SKIPPED]
 * wenva/helloworld ... [SKIPPED]
done
Dumping uploads ... 
done
Creating backup archive: 1413189434_gitlab_backup.tar ... done
Deleting tmp directories ... done
Deleting old backups ... skipping
sh-4.1# ls -al tmp/backups/
total 192
drwxr-xr-x 2 root root  4096 Oct 13 16:37 .
drwxrwxr-x 6 git  git   4096 Oct 11 16:57 ..
-rw-r--r-- 1 root root 40960 Oct 11 16:58 1413008522_gitlab_backup.tar
-rw-r--r-- 1 root root 40960 Oct 11 16:57 1413017852_gitlab_backup.tar
-rw-r--r-- 1 root root 51200 Oct 13 16:36 1413189369_gitlab_backup.tar
-rw-r--r-- 1 root root 51200 Oct 13 16:37 1413189434_gitlab_backup.tar
</pre>

<ul>
<li><p>恢复(Restore)</p>
<p>  通过Gitlab自带的备份命令”bundle exec bin/rake gitlab:backup:restore RAILS_ENV=production BACKUP=xxxxxx”,可以很容易地回复到时间戳xxxxxx对应的状态.</p>
</li>
</ul>
<p>###用户管理<br>当Gitlab启动后，通过浏览器输入服务器IP，就可以看到如下登录界面，可以利用配置的管理者进行登录，管理者登入Gitlab系统后，点击右上角的”Admin area”可以进入Projects、Users、Groups管理界面.可以对User和Group进行增删改操作.</p>
<p><img src="http://127.0.0.1:8080/markdown/2014-10-13_15-34-40.png" alt="image"></p>
<p>##开发模型构建</p>
<p>##GIT命令及客户端</p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/blog/2014/10/23/2014-10-23-sed命令使用/" rel="prev" title="sed命令学习">
                sed命令学习 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <p class="site-author-name" itemprop="name">smallmuou</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/blog/archives/">
              
                  <span class="site-state-item-count">197</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/blog/categories/index.html">
                  <span class="site-state-item-count">12</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            

          </nav>

          

          
            <div class="links-of-author motion-element">
                
                  <span class="links-of-author-item">
                    <a href="https://github.com/smallmuou" target="_blank" title="GitHub">
                      
                        <i class="fa fa-fw fa-globe"></i>GitHub</a>
                  </span>
                
            </div>
          

          
          

          
          

          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2020</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">smallmuou</span>

  
</div>

    <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

    <span id="busuanzi_container_site_pv">总访问量<span id="busuanzi_value_site_pv"></span>次</span>
    <span class="post-meta-divider">|</span>



  <div class="powered-by">由 <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a> 强力驱动</div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">主题 &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Muse</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/blog/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/blog/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/motion.js?v=5.1.4"></script>



  
  

  
  <script type="text/javascript" src="/blog/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/blog/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/blog/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
